<html>

<body>
  <textarea id="cmd"></textarea>
  <p>点击后自动复制到剪贴板</p>
  <button onclick="base64_encode()">base64编码</button>
  <button onclick="hex_encode()">16进制编码</button>
  <button onclick="url_encode()">url编码</button>
  <br>
  <button onclick="base64_decode()">base64解码</button>
  <button onclick="hex_decode()">16进制解码（hex2bin/bytes.fromhex）</button>
  <button onclick="url_decode()">url解码</button>
  <br />
  <button onclick="filter_base64_protocal()">filter协议</button>
  <button onclick="data_protocal()">data协议</button>
  <button onclick="data_base64_protocal()">data base64协议</button>
  <button onclick="gopher_protocal()">gopher协议 (Curl)</button>
  <br />
  <button onclick="unicode_replace()">unicode等价替换</button>
  <br />
  <button onclick="ip_decimal()">十进制IP</button>
  <button onclick="ip_oct()">八进制IP</button>
  <button onclick="ip_hex()">十六进制IP</button>
</body>
<script>
  var text = '';
  const copy = () => {
    text = document.getElementById("cmd").value;
  };

  const paste = () => {
    document.getElementById("cmd").value = text;
    navigator.clipboard.writeText(text);
  };

  const base64_encode = () => {
    copy();
    text = btoa(text);
    paste();
  };
  const base64_decode = () => {
    copy();
    text = atob(text);
    paste();
  };
  const hex_encode = () => {
    copy()
    const encoder = new TextEncoder();
    const uint8Array = encoder.encode(text);
    text = Array.from(uint8Array).map(byte =>
      byte.toString(16).padStart(2, '0')
    ).join('');
    paste()
  }
  const hex_decode = () => {
    copy()
    const bytesArray = Array.from(text.match(/[\da-fA-F]{2}/g))
      .map(byte => parseInt(byte, 16));
    const uint8Array = new Uint8Array(bytesArray);
    const decoder = new TextDecoder('utf-8');
    text = decoder.decode(uint8Array);
    paste()
  }
  const url_encode = () => {
    copy();
    text = encodeURIComponent(text);
    paste();
  };
  const url_decode = () => {
    copy();
    text = decodeURIComponent(text);
    paste();
  };
  const filter_base64_protocal = () => {
    copy();
    text = "php://filter/convert.base64-encode/resource=" + text;
    paste();
  };
  const data_protocal = () => {
    copy();
    text = "data://text/plain," + text;
    paste();
  };
  const data_base64_protocal = () => {
    copy();
    text = "data://text/plain;base64," + btoa(text);
    paste();
  };
  const gopher_protocal = () => {
    copy();
    const host = /Host\s*:\s*([^\s]+)/.exec(text);
    if (!host) {
      text = `参考输入示例：
GET / HTTP1.1
Host:localhost`;
    } else {
      text = text.trim().replaceAll(": ", ":");
      text = `gopher://${host[1]}:80/_${text
        .replaceAll("\n", "%0d%0a")
        .replaceAll("?", "%3f")
        .replaceAll(" ", "%20")}%0d%0a`;
    }

    paste();
  };

  const unicode_replace = () => {
    copy();
    text = text.replace(/\w/g, (match) => {
      const mapArray = unicodeMap.get(match);
      if (mapArray) {
        const randomIndex = Math.floor(Math.random() * mapArray.length);
        return mapArray[randomIndex];
      } else {
        return match;
      }
    });
    paste();
  };

  const ip_decimal = () => {
    copy();
    let ip = text.split(".");
    text =
      (parseInt(ip[0]) << 24) |
      (parseInt(ip[1]) << 16) |
      (parseInt(ip[2]) << 8) |
      parseInt(ip[3]);
    if (text < 0) {
      text += 4294967296; // 在 JavaScript 中，32位整数会自动转换为有符号整数，所以这个操作可能不是必需的
    }
    paste();
  };

  const ip_oct = () => {
    ip_decimal();
    text = "0" + text.toString(8);
    paste();
  };

  const ip_hex = () => {
    ip_decimal();
    text = "0x" + text.toString(16);
    paste();
  };
</script>
<style>
  #cmd {
    width: 100vw;
    height: 50vh;
  }
</style>
<script>
  const unicodeMap = new Map([
    [
      " ",
      [
        " ",
        "¨",
        "¯",
        "´",
        "¸",
        "˘",
        "˙",
        "˚",
        "˛",
        "˜",
        "˝",
        "ͺ",
        "΄",
        "΅",
        "᾽",
        "᾿",
        "῀",
        "῁",
        "῍",
        "῎",
        "῏",
        "῝",
        "῞",
        "῟",
        "῭",
        "΅",
        "´",
        "῾",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        " ",
        "‗",
        " ",
        "‾",
        " ",
        "　",
        "゛",
        "゜",
        "ﱞ",
        "ﱟ",
        "ﱠ",
        "ﱡ",
        "ﱢ",
        "ﱣ",
        "﹉",
        "﹊",
        "﹋",
        "﹌",
        "ﹰ",
        "ﹲ",
        "ﹴ",
        "ﹶ",
        "ﹸ",
        "ﹺ",
        "ﹼ",
        "ﹾ",
        "￣",
      ],
    ],
    ["a", ["ª", "ᵃ", "ẚ", "ₐ", "℀", "℁", "ⓐ", "㏂", "ａ"]],
    [
      "2",
      [
        "²",
        "₂",
        "⅔",
        "⅖",
        "②",
        "⑳",
        "⒉",
        "⒛",
        "㉑",
        "㉒",
        "㉓",
        "㉔",
        "㉕",
        "㉖",
        "㉗",
        "㉘",
        "㉙",
        "㋁",
        "㍚",
        "㍬",
        "㍭",
        "㍮",
        "㍯",
        "㍰",
        "㏡",
        "㏳",
        "㏴",
        "㏵",
        "㏶",
        "㏷",
        "㏸",
        "㏹",
        "㏺",
        "㏻",
        "㏼",
        "２",
      ],
    ],
    [
      "3",
      [
        "³",
        "¾",
        "₃",
        "⅗",
        "⅜",
        "③",
        "⒊",
        "㉚",
        "㉛",
        "㉜",
        "㉝",
        "㉞",
        "㉟",
        "㊱",
        "㊲",
        "㊳",
        "㊴",
        "㋂",
        "㍛",
        "㏢",
        "㏽",
        "㏾",
        "３",
      ],
    ],
    [
      "1",
      [
        "¹",
        "¼",
        "½",
        "₁",
        "⅐",
        "⅑",
        "⅒",
        "⅓",
        "⅕",
        "⅙",
        "⅛",
        "⅟",
        "①",
        "⑩",
        "⑪",
        "⑫",
        "⑬",
        "⑭",
        "⑮",
        "⑯",
        "⑰",
        "⑱",
        "⑲",
        "⒈",
        "⒑",
        "⒒",
        "⒓",
        "⒔",
        "⒕",
        "⒖",
        "⒗",
        "⒘",
        "⒙",
        "⒚",
        "㋀",
        "㋉",
        "㋊",
        "㋋",
        "㍙",
        "㍢",
        "㍣",
        "㍤",
        "㍥",
        "㍦",
        "㍧",
        "㍨",
        "㍩",
        "㍪",
        "㍫",
        "㏠",
        "㏩",
        "㏪",
        "㏫",
        "㏬",
        "㏭",
        "㏮",
        "㏯",
        "㏰",
        "㏱",
        "㏲",
        "１",
      ],
    ],
    ["o", ["º", "ᵒ", "ₒ", "ℴ", "ⓞ", "㍵", "ｏ"]],
    ["I", ["Ĳ", "ᴵ", "ℐ", "ℑ", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅸ", "Ⓘ", "㍺", "Ｉ"]],
    [
      "i",
      ["ĳ", "ᵢ", "ⁱ", "ℹ", "ⅈ", "ⅰ", "ⅱ", "ⅲ", "ⅳ", "ⅸ", "ⓘ", "㏌", "ｉ"],
    ],
    ["L", ["Ŀ", "Ǉ", "ǈ", "ᴸ", "ℒ", "Ⅼ", "Ⓛ", "㋏", "Ｌ"]],
    ["l", ["ŀ", "ǉ", "ˡ", "ₗ", "ℓ", "ⅼ", "ⓛ", "㏐", "㏑", "㏒", "㏓", "ｌ"]],
    ["s", ["ſ", "ˢ", "ₛ", "ⓢ", "㏛", "ﬅ", "ﬆ", "ｓ"]],
    ["D", ["Ǆ", "ǅ", "Ǳ", "ǲ", "ᴰ", "ⅅ", "Ⅾ", "Ⓓ", "Ｄ"]],
    [
      "d",
      [
        "ǆ",
        "ǳ",
        "ᵈ",
        "ⅆ",
        "ⅾ",
        "ⓓ",
        "㍲",
        "㍷",
        "㍸",
        "㍹",
        "㎗",
        "㏈",
        "ｄ",
      ],
    ],
    ["N", ["Ǌ", "ǋ", "ᴺ", "ℕ", "№", "Ⓝ", "Ｎ"]],
    ["n", ["ǌ", "ⁿ", "ₙ", "ⓝ", "㎁", "㎋", "㎚", "㎱", "㎵", "㎻", "ｎ"]],
    ["h", ["ʰ", "ₕ", "ℎ", "ⓗ", "㍱", "㏊", "ｈ"]],
    ["j", ["ʲ", "ⅉ", "ⓙ", "ⱼ", "ｊ"]],
    ["r", ["ʳ", "ᵣ", "ⓡ", "㎭", "㎮", "㎯", "ｒ"]],
    ["w", ["ʷ", "ⓦ", "ｗ"]],
    ["y", ["ʸ", "ⓨ", "ｙ"]],
    ["x", ["ˣ", "ₓ", "ⅹ", "ⅺ", "ⅻ", "ⓧ", "ｘ"]],
    [";", [";", "︔", "﹔", "；"]],
    ["A", ["ᴬ", "Ⓐ", "㍳", "㏟", "Ａ"]],
    ["B", ["ᴮ", "ℬ", "Ⓑ", "㏃", "Ｂ"]],
    ["E", ["ᴱ", "ℰ", "Ⓔ", "Ｅ"]],
    ["G", ["ᴳ", "Ⓖ", "㎇", "㎓", "㎬", "㏉", "Ｇ"]],
    ["H", ["ᴴ", "ℋ", "ℌ", "ℍ", "Ⓗ", "㋌", "㎐", "㏋", "Ｈ"]],
    ["J", ["ᴶ", "Ⓙ", "Ｊ"]],
    ["K", ["ᴷ", "K", "Ⓚ", "㎅", "㏍", "㏎", "Ｋ"]],
    ["M", ["ᴹ", "ℳ", "Ⅿ", "Ⓜ", "㎆", "㎒", "㎫", "㎹", "㎿", "㏁", "Ｍ"]],
    ["O", ["ᴼ", "Ⓞ", "Ｏ"]],
    ["P", ["ᴾ", "ℙ", "Ⓟ", "㉐", "㎩", "㏗", "㏙", "㏚", "Ｐ"]],
    ["R", ["ᴿ", "₨", "ℛ", "ℜ", "ℝ", "Ⓡ", "Ｒ"]],
    ["T", ["ᵀ", "℡", "™", "Ⓣ", "㎔", "Ｔ"]],
    ["U", ["ᵁ", "Ⓤ", "Ｕ"]],
    ["W", ["ᵂ", "Ⓦ", "㏝", "Ｗ"]],
    ["b", ["ᵇ", "ⓑ", "㍴", "ｂ"]],
    ["e", ["ᵉ", "ₑ", "ℯ", "ⅇ", "ⓔ", "㋍", "㋎", "ｅ"]],
    ["g", ["ᵍ", "ℊ", "ⓖ", "㏿", "ｇ"]],
    [
      "k",
      [
        "ᵏ",
        "ₖ",
        "ⓚ",
        "㎄",
        "㎉",
        "㎏",
        "㎑",
        "㎘",
        "㎞",
        "㎢",
        "㎦",
        "㎪",
        "㎸",
        "㎾",
        "㏀",
        "㏏",
        "ｋ",
      ],
    ],
    [
      "m",
      [
        "ᵐ",
        "ₘ",
        "ⅿ",
        "ⓜ",
        "㎃",
        "㎎",
        "㎖",
        "㎜",
        "㎟",
        "㎡",
        "㎣",
        "㎥",
        "㎧",
        "㎨",
        "㎳",
        "㎷",
        "㎽",
        "㏔",
        "㏕",
        "㏖",
        "ｍ",
      ],
    ],
    ["p", ["ᵖ", "ₚ", "ⓟ", "㍶", "㎀", "㎊", "㎰", "㎴", "㎺", "㏘", "ｐ"]],
    ["t", ["ᵗ", "ₜ", "ⓣ", "ｔ"]],
    ["u", ["ᵘ", "ᵤ", "ⓤ", "ｕ"]],
    ["v", ["ᵛ", "ᵥ", "ⅴ", "ⅵ", "ⅶ", "ⅷ", "ⓥ", "ｖ"]],
    [
      "c",
      ["ᶜ", "℅", "℆", "ⅽ", "ⓒ", "㎈", "㎝", "㎠", "㎤", "㏄", "㏅", "ｃ"],
    ],
    ["f", ["ᶠ", "ⓕ", "㎙", "ﬀ", "ﬁ", "ﬂ", "ﬃ", "ﬄ", "ｆ"]],
    ["z", ["ᶻ", "ⓩ", "ｚ"]],
    ["`", ["`", "｀"]],
    [".", ["․", "‥", "…", "︙", "︰", "﹒", "．"]],
    ["!", ["‼", "⁉", "︕", "﹗", "！"]],
    ["?", ["⁇", "⁈", "︖", "﹖", "？"]],
    ["0", ["⁰", "₀", "↉", "⓪", "㍘", "０"]],
    [
      "4",
      [
        "⁴",
        "₄",
        "⅘",
        "④",
        "⒋",
        "㊵",
        "㊶",
        "㊷",
        "㊸",
        "㊹",
        "㊺",
        "㊻",
        "㊼",
        "㊽",
        "㊾",
        "㋃",
        "㍜",
        "㏣",
        "４",
      ],
    ],
    ["5", ["⁵", "₅", "⅚", "⅝", "⑤", "⒌", "㊿", "㋄", "㍝", "㏤", "５"]],
    ["6", ["⁶", "₆", "⑥", "⒍", "㋅", "㍞", "㏥", "６"]],
    ["7", ["⁷", "₇", "⅞", "⑦", "⒎", "㋆", "㍟", "㏦", "７"]],
    ["8", ["⁸", "₈", "⑧", "⒏", "㋇", "㍠", "㏧", "８"]],
    ["9", ["⁹", "₉", "⑨", "⒐", "㋈", "㍡", "㏨", "９"]],
    ["+", ["⁺", "₊", "﬩", "﹢", "＋"]],
    ["=", ["⁼", "₌", "⩵", "⩶", "﹦", "＝"]],
    [
      "(",
      [
        "⁽",
        "₍",
        "⑴",
        "⑵",
        "⑶",
        "⑷",
        "⑸",
        "⑹",
        "⑺",
        "⑻",
        "⑼",
        "⑽",
        "⑾",
        "⑿",
        "⒀",
        "⒁",
        "⒂",
        "⒃",
        "⒄",
        "⒅",
        "⒆",
        "⒇",
        "⒜",
        "⒝",
        "⒞",
        "⒟",
        "⒠",
        "⒡",
        "⒢",
        "⒣",
        "⒤",
        "⒥",
        "⒦",
        "⒧",
        "⒨",
        "⒩",
        "⒪",
        "⒫",
        "⒬",
        "⒭",
        "⒮",
        "⒯",
        "⒰",
        "⒱",
        "⒲",
        "⒳",
        "⒴",
        "⒵",
        "㈀",
        "㈁",
        "㈂",
        "㈃",
        "㈄",
        "㈅",
        "㈆",
        "㈇",
        "㈈",
        "㈉",
        "㈊",
        "㈋",
        "㈌",
        "㈍",
        "㈎",
        "㈏",
        "㈐",
        "㈑",
        "㈒",
        "㈓",
        "㈔",
        "㈕",
        "㈖",
        "㈗",
        "㈘",
        "㈙",
        "㈚",
        "㈛",
        "㈜",
        "㈝",
        "㈞",
        "㈠",
        "㈡",
        "㈢",
        "㈣",
        "㈤",
        "㈥",
        "㈦",
        "㈧",
        "㈨",
        "㈩",
        "㈪",
        "㈫",
        "㈬",
        "㈭",
        "㈮",
        "㈯",
        "㈰",
        "㈱",
        "㈲",
        "㈳",
        "㈴",
        "㈵",
        "㈶",
        "㈷",
        "㈸",
        "㈹",
        "㈺",
        "㈻",
        "㈼",
        "㈽",
        "㈾",
        "㈿",
        "㉀",
        "㉁",
        "㉂",
        "㉃",
        "︵",
        "﹙",
        "（",
      ],
    ],
    [")", ["⁾", "₎", "︶", "﹚", "）"]],
    ["C", ["ℂ", "ℭ", "Ⅽ", "Ⓒ", "㏆", "㏇", "Ｃ"]],
    ["Q", ["ℚ", "Ⓠ", "Ｑ"]],
    ["S", ["℠", "Ⓢ", "㏜", "Ｓ"]],
    ["Z", ["ℤ", "ℨ", "Ⓩ", "Ｚ"]],
    ["F", ["ℱ", "℻", "Ⓕ", "Ｆ"]],
    ["V", ["Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⓥ", "ⱽ", "㏞", "Ｖ"]],
    ["X", ["Ⅹ", "Ⅺ", "Ⅻ", "Ⓧ", "Ｘ"]],
    ["Y", ["Ⓨ", "Ｙ"]],
    ["q", ["ⓠ", "ｑ"]],
    [",", ["⩴", "︓", "﹕", "："]],
    [",", ["︐", "﹐", "，"]],
    ["_", ["︳", "︴", "﹍", "﹎", "﹏", "＿"]],
    ["{", ["︷", "﹛", "｛"]],
    ["}", ["︸", "﹜", "｝"]],
    ["[", ["﹇", "［"]],
    ["]", ["﹈", "］"]],
    ["#", ["﹟", "＃"]],
    ["&", ["﹠", "＆"]],
    ["*", ["﹡", "＊"]],
    ["-", ["﹣", "－"]],
    ["<", ["﹤", "＜"]],
    [">", ["﹥", "＞"]],
    ["\\", ["﹨", "＼"]],
    ["$", ["﹩", "＄"]],
    ["%", ["﹪", "％"]],
    ["@", ["﹫", "＠"]],
    ['"', ["＂"]],
    ["'", ["＇"]],
    ["/", ["／"]],
    ["^", ["＾"]],
    ["|", ["｜"]],
    ["~", ["～"]],
  ]);
</script>

</html>